Image Compression using PCA

library(jpeg)
# Load the image and separate rgb color
tiger = readJPEG("tiger.jpeg")
r = tiger[,,1]
g = tiger[,,2]
b = tiger[,,3]
# Perform PCA for each color
r.pca <- prcomp(r, center = F)
g.pca <- prcomp(g, center = F)
b.pca <- prcomp(b, center = F)
# Plot the fraction of variance as k increases
r.var <- r.pca$sdev^2 / sum(r.pca$sdev^2)
r.var.cum <- cumsum(r.var)
g.var <- g.pca$sdev^2 / sum(g.pca$sdev^2)
g.var.cum <- cumsum(g.var)
b.var <- b.pca$sdev^2 / sum(b.pca$sdev^2)
b.var.cum <- cumsum(b.var)

x <- seq(1,length(r.var))

plot(x, r.var.cum, "l", col = "red")
lines(x, g.var.cum, "l", col = "green")
lines(x, b.var.cum, "l", col = "blue")

# Save and show the new compressed photos
p = length(r.pca$sdev)
rgb.pca <- list(r.pca, g.pca, b.pca)

for (i in c(3, 5, 10, 25, 50, 100, 200, 400, p)) {
  pca.img <- sapply(rgb.pca, function(j) {
    compressed.img <- j$x[,1:i] %*% t(j$rotation[,1:i])
  }, simplify = 'array')
  writeJPEG(pca.img, paste('tiger_', round(i,0), '_components.jpg', sep = ''))
  jj <- readJPEG(paste('tiger_', round(i,0), '_components.jpg', sep = ''), native=TRUE)
  plot(0:1,0:1,type="n",axes=FALSE, main = paste('tiger_', round(i,0), '_components.jpg', sep = ''))
  rasterImage(jj,0,0,1,1)
}